// 引入experss模块
const express = require('express')
// 引入sha1模块
const sha1 = require('sha1')
// 创建app应用对象
const app = express();
// 验证服务器的有效性
/*
1、微信服务器知道开发者服务器是哪个
-测试号管理页面上填写url服务器地址
    - 使用ngrok内网穿透 将本地端口号开启的服务映射外网跨域访问一个网址
    - ngrok http 3000
-填写 token
    -参与微信签名加密的一个参数
2、开发者服务器 - 验证消息是否来自于微信服务器
    目的：计算得出signature微信加密签名，和微信传递过来的signature进行对比，
    如果一样，说明消息来自于微信服务器
    如果不一样，说明不是微信服务器发送的消息
    1、将参与微信加密签名的三个参数（timestamp、nonce、token）按照字典序排序并组合在一起形成一个数组
    2、将数组里所有参数拼接成一个字符串，进行sha1加密
    3、加密完成就生成一个signatrue，和微信发送过来的进行对比
        如果一样，说明消息来自于微信服务器，返回echostr给微信服务器
        如果不一样，说明不是微信服务器发送的消息，返回error
 */
// 定义配置对象
const config ={
    token: 'wechattoken',
    appID: 'wx3da1125a263d431f',
    appsecret: '9e454da03d5d9b31011ae6023861d2ea'
}
// 接受处理所有消息
app.use((req, res, next) => {
    // 微信服务器提交的参数
    console.log(req.query)
    /*{
        signature: '736faf5ea8f5f7445a4715c9cee7c403f1cdc8d1', //微信的加密签名
        echostr: '5642856763853107183', // 微信的随机字符串
        timestamp: '1583064557', // 微信的发生请求时间戳
        nonce: '1167935419' // 微信的随机数字
        }*/
    const {signature, echostr, timestamp, nonce} = req.query;
    const {token} = config

    // 1、将参与微信加密签名的三个参数（timestamp、nonce、token）按照字典序排序并组合在一起形成一个数组
    const arr = [timestamp, nonce, token];
    const arrSort = arr.sort();
    console.log(arrSort);
    // 2、将数组里所有参数拼接成一个字符串，进行sha1加密
    const str = arr.join('');
    console.log(str)
    const sha1Str = sha1(str)
    console.log(sha1Str)
    // 3、加密完成就生成一个signatrue，和微信发送过来的进行对比
    if (sha1Str === signature) {
        // 如果一样，说明消息来自于微信服务器，返回echostr给微信服务器
        res.send(echostr)
    } else {
        // 如果不一样，说明不是微信服务器发送的消息，返回error
        res.end('error')
    }

})
// 监听端口号
app.listen(8080, () => console.log('服务器启动成功了~'))
